﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace EveMarketsDAO.Fonction
{
	public class FonctionCalculateur
	{
		/// <summary>
		/// Permet de supprimer les enregistrements de la table 'Resultats' par rapport
		/// à son TechLevel.
		/// </summary>
		/// <param name="techLevel">numéro du techLevel</param>
		public void DeleteTableResultat(int techLevel)
		{
			ContexteDAO.ContexteDonnees.ExecuteStoreCommand("DELETE FROM Resultats");
		}
		
		/// <summary>
		/// Récupère la liste des composants pour un blueprint donné.
		/// </summary>
		/// <param name="idBlueprint"></param>
		/// <returns></returns>
		public List<ComposantsBlueprint> GetListComposant(int idBlueprint)
		{
			 return (from compo in ContexteDAO.ContexteDonnees.ComposantsBlueprint
			 where idBlueprint.Equals(compo.IdBlueprint) && compo.ActivityId.Equals(1)
			 select compo).ToList();
		}

		/// <summary>
		/// Retourne le production efficiency du blueprint donné.
		/// </summary>
		/// <param name="idBlueprint"></param>
		/// <returns></returns>
		public int GetProdEfficiency(int idBlueprint)
		{
			return ContexteDAO.ContexteDonnees.UserBluePrint.Where(x => x.IdBluePrint.Equals(idBlueprint))
				.Select(y => y.ProductionEfficiency).DefaultIfEmpty(0).First();
		}

		/// <summary>
		/// Retourne le materiel efficiency du blueprint donné.
		/// </summary>
		/// <param name="idBlueprint"></param>
		/// <returns></returns>
		public int GetMaterielEfficiency(int idBlueprint)
		{
			return ContexteDAO.ContexteDonnees.UserBluePrint.Where(x => x.IdBluePrint.Equals(idBlueprint))
				.Select(y => y.MaterielEfficiency).DefaultIfEmpty(0).First();
		}

		/// <summary>
		/// Détermine si c'est un blueprint de type Drone.
		/// </summary>
		/// <param name="blueprintAtraiter"></param>
		/// <returns></returns>
		public bool IsDroneBlueprint(LesBlueprints blueprintAtraiter)
		{
			return (blueprintAtraiter.LiensVers_typeId_pour_ProductTypeId.LienVers_invGroups_groupID_groupID.categoryID == 18);
		}

		/// <summary>
		/// Détermine si c'est un composant de type minéral.
		/// </summary>
		/// <param name="composantsBlueprint"></param>
		/// <returns></returns>
		public bool IsComposantMineral(ComposantsBlueprint composantsBlueprint)
		{
			return (composantsBlueprint.LiensVers_TypeId_pour_CompoId.groupID == 18);
		}

		/// <summary>
		/// Récupère la liste des Blueprints par rapport au TechLevel.
		/// </summary>
		/// <param name="techLevel">Tech level du blueprint</param>
		/// <returns></returns>
		public List<LesBlueprints> GetListBlueprint(int techLevel)
		{
			return (from bp in ContexteDAO.ContexteDonnees.LesBlueprints
					where bp.TechLevel == techLevel
					&& bp.invItemsTypes.published == true
					select bp).ToList();
		}

		/// <summary>
		/// Sauvegarde les résultats dans la base de donnée.
		/// </summary>
		/// <param name="resultatCalcul"></param>
		public void SaveResultatsCalcul(Tuple<Resultats, List<ResultatsDetails>> resultatCalcul)
		{
			var entite = new EveIndusEntities();

			Resultats resultats = resultatCalcul.Item1;
			List<ResultatsDetails> listResultatsDetails = resultatCalcul.Item2;

			// Si l'objet est null, c'est qu'il y a eu un problème.
			if(resultats.IdItem.Equals(0))
				return;

			entite.Resultats.AddObject(resultats);
			foreach (var resDetails in listResultatsDetails)
			{
				entite.ResultatsDetails.AddObject(resDetails);
			}

			entite.SaveChanges();
			entite.Dispose();
		}

		/// <summary>
		/// Récupère le blueprint par rapport à son nom.
		/// </summary>
		/// <param name="nomBlueprint"></param>
		/// <returns></returns>
		public LesBlueprints GetBlueprintByName(string nomBlueprint)
		{
			return (from bp in ContexteDAO.ContexteDonnees.LesBlueprints
			 where bp.invItemsTypes.typeName.Equals(nomBlueprint)
			 select bp).First();
		}

		/// <summary>
		/// Retourne les résultats de calcul.
		/// </summary>
		/// <returns></returns>
		public System.Collections.IEnumerable GetResultatsCalculs()
		{
			return (from resultat in ContexteDAO.ContexteDonnees.Resultats
					select resultat);
		}

		/// <summary>
		/// Retourne le nombre de run pour un blueprint passé en paramètre.
		/// </summary>
		/// <param name="idBlueprint"></param>
		/// <returns></returns>
		public int GetNbreRunByBlueprint(int idBlueprint)
		{
			return ContexteDAO.ContexteDonnees.RunBlueprint
						.Where(y => y.IdBlueprint.Equals(idBlueprint))
						.Select(x => x.NombreRuns).DefaultIfEmpty(1).First();
		}

		/// <summary>
		/// Retourne le nombre de item construit pour 1 Run, pour le blueprint
		/// passé en paramètre.
		/// </summary>
		/// <param name="idBlueprint"></param>
		/// <returns></returns>
		public int GetNombreItemParRunByBlueprint(int idBlueprint)
		{
			return ContexteDAO.ContexteDonnees.RunBlueprint
						.Where(y => y.IdBlueprint.Equals(idBlueprint))
						.Select(x => x.NombreParRun).DefaultIfEmpty(1).First();
		}
 
	}
}
